HADOOP HA 搭建:
1.SSH相互信任关系配置和host文件配置:
注意事项:
~/.ssh的权限为700
1 | chmod -R 700 /.ssh |
~/.ssh/authorized_keys的权限是600或者640
1 | chmod -R 600 /.ssh/authorized_keys |
操作步骤:
1 | 依次在3台机器上分别执行: |
进入ssh下,ll查看:
将id——rsa.pub公钥文件追加到authorized认证文件中
将hadoop002和hadoop003机器上的id_rsa.pub文件传输到hadoop001机器中:
这个时候会发现 让我们输入密码,但是我们用的hadoop用户,并没有密码,所以需要用root用户:
查看hadoop001中ssh下的文件:
将传过来的公钥文件追加到认证文件中:
cat查看一下公钥文件中的信息:
这个时候我们需要配置一下hosts中的配置:
记住:每台机器都要测试对其他两台和自己的连接关系;因为第一次连接需要输入yes
known_hosts是记录每台第一次连接进入的信息;也就是我们输入yes后会有记录在known_hosts里。
【坑】假设known_hosts文件里有一台的ssh发生了变更;不要把known_hosts删除【会造成整个分布式系统的瘫痪】;要进入known_hosts文件找到那一台机器所在行;删除那一行即可。
然后将配置到的公钥文件authorized传到其它两台机器的ssh下,这就完成了多台机器ssh互信配置
2.JDK部署
1.将解压包解压到mkdir /usr/java/ 【用root用户】
因为CDH shell脚本默认java安装目录是/usr/java/
将jdk压缩包传入之后并解压:
2.权限变更:
解压 jdk之后会出现 权限变更的情况,需要修改权限:
3.Zookeeper部署及定位
1.解压zk:
2. 建立软连接
3. 进入zoo.cfg配置hadoop01的zk
[hadoop@hadoop01 app]$ cd zookeeper
[hadoop@hadoop01 zookeeper]$ cd conf
[hadoop@hadoop01 conf]$ cp zoo_sample.cfg zoo.cfg
[hadoop@hadoop01 conf]$ vi zoo.cfg
更改配置文件zoo.cfg
1 | dataDir=/home/hadoop/app/zookeeper/data #此目录要提前创建好 |
[hadoop@hadoop01 zookeeper]$ touch data/myid
【这里的data就是/home/hadoop/app/zookeeper/data】
==注:配置中有默认的存储目录,在tmp下,但是这里会出现问题,Linux周期30天会清除tmp下的 文件,myid文件会被清除,所以我们需要指定存储目录==
【坑】myid的大小是两个字节【也就是只有一个数字;不要有空格】[hadoop@hadoop01 zookeeper]$ echo 1 > data/myid
[hadoop@hadoop01 zookeeper]$ ll data/myid
-rw-rw-r–. 1 hadoop hadoop 2 3月 31 13:38 data/myid
拷贝zoo.cfg到hadoop02和hadoop03
[hadoop@hadoop01 zookeeper]$ scp conf/zoo.cfg hadoop02:/home/hadoop/app/zookeeper/conf/
zoo.cfg 100% 1023 130.5KB/s 00:00
[hadoop@hadoop01 zookeeper]$ scp conf/zoo.cfg hadoop03:/home/hadoop/app/zookeeper/conf/
zoo.cfg 100% 1023 613.4KB/s 00:00
拷贝data目录到hadoop02和hadoop03
[hadoop@hadoop01 zookeeper]$ scp -r data hadoop03:/home/hadoop/app/zookeeper/
myid 100% 2 1.6KB/s 00:00
[hadoop@hadoop01 zookeeper]$ scp -r data hadoop02:/home/hadoop/app/zookeeper/
myid 100% 2 0.9KB/s 00:00
修改myid文件【一个>号相当于覆盖】
[hadoop@hadoop02 zookeeper]$ echo 2 > data/myid
[hadoop@hadoop03 zookeeper]$ echo 3 > data/myid
4、配置环境变量【~./bash_profile】完毕后加载一下source ~/.bash_profile
1 | export JAVA_HOME=/usr/java/jdk1.8.0_45 |
5、启动加查看状态
注意:如有出错以debug模式检查;shell脚本启动打开debug模式的方法在第一行加入(-x)即可如下:
#!/usr/bin/env bash ==-x==
运行这个脚本即可看到运行debug模式来定位问题
5、部署Hadoop
1.解压jar包;并建立软连接
2.配置环境变量【每台】
1 | vim ~/.bash_profile |
3.到配置文件夹下配置必须的配置文件
4.创建文件夹【每台】
1 | mkdir -p /home/hadoop/app/hadoop-2.6.0-cdh5.7.0/tmp |
5.把需要配置的默认配置文件都删除
6.上传四个配置文件到节点【每个节点】$HADOOP_HOME/etc/hadoop
==【注意:大坑】下列文件最好在centos系统中建立;不要在windows上直接上传过去;会有坑
比如坑:Name or service not knownstname hadoop01;这是识别不了slaves里配置的服务==
slaves
1 | hadoop01 |
core-site.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
hdfs-site.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
mapred-site.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
yarn-site.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
7.修改vim hadoop-env.sh 【三台】
1 | export JAVA_HOME=/usr/java/jdk1.8.0_45 |
8.第一次启动步骤:
*(1)先启动JN【每台】*
这里有个问题:生产上如何增加JN的节点呢?详情:https://blog.csdn.net/lifuxiangcaohui/article/details/52329933
*(2)格式化Hadoop【hadoop01】并将data目录传入hadoop2*
1 | [hadoop@hadoop01 hadoop]$ hadoop namenode -format |
*(3)初始化ZKFC*
1 | [hadoop@hadoop01 hadoop]$ hdfs zkfc -formatZK |
*(3)在hadoop01启动dfs集群*
*(4)在hadoop01启动yarn集群*
1 | [hadoop@hadoop01 hadoop]$ start-yarn.sh |
(5)手动启动RM2
1 | [hadoop@hadoop02 hadoop]$ yarn-daemon.sh start resourcemanager |
*(6)启动日志管理*
1 | [hadoop@hadoop01 hadoop]$ mr-jobhistory-daemon.sh start historyserver |
(7)运行一个例子
1 | [hadoop@hadoop01 hadoop]$ hadoop jar ./share/hadoop/mapreduce2/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar pi 5 10 |
出现错误排查:是这个版本不支持snappy压缩格式的问题
1 | 通过查看我们压缩格式不支持:如下查看 |
1 | [hadoop@hadoop01 hadoop]$ hadoop checknative |
去掉配置的压缩条件就可以正常运行本demo
6、停止集群并进行第二次启动
1 | [hadoop@hadoop01 hadoop]$ stop-all.sh |
启动集群
1 | [hadoop@hadoop01 hadoop]$ zkServer.sh start |
7、集群监控
1 | HDFS: http://hadoop01:50070/ |
思考:
为什么map端用snappy压缩格式;而reduce用gzip或者bzip2的压缩格式呢?为什么每个reduce端压缩后的数据不要超过一个block的大小呢?
1、首先我们根据博客中的压缩格式对比snappy的压缩时间最快;而map是输出数据落地磁盘故选择时间最快的输出压缩格式snappy;
2、reduce是结果落盘;故考虑占用磁盘空间的大小;选择高压缩比gzip或者bzip2;而考虑到会用reduce结果做二次运算;
则对于选用不支持分割gzip或者bzip2原因有两个:
(1)是这两个压缩格式高
(2)对于不可分割我们采用每个reduce端压缩后的数据不要超过一个block的大小的方法;则对于后续的map清洗也就不会出现分割问题。